package com.estore.service;

import com.estore.model.Product;
import java.util.*;
import java.io.*;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {
    // 存储商品数据的Map，key为商品ID，value为商品对象
    private Map<Integer, Product> productMap = new HashMap<>();
    private String dataFile; // 从配置文件读取路径

    // 构造函数中调用加载配置和数据方法
    public ProductService() {
        loadConfig();
        loadData();
    }

    // 加载配置文件
    private void loadConfig() {
        Properties props = new Properties();
        try (InputStreamReader isr = new InputStreamReader(
                new FileInputStream("config.properties"), "UTF-8")) {
            props.load(isr);
            dataFile = props.getProperty("data.file.path");
            System.out.println("配置文件加载成功，数据文件路径：" + dataFile);
        } catch (IOException e) {
            System.err.println("加载配置文件失败：" + e.getMessage());
            dataFile = "products.dat"; // 配置加载失败时使用默认路径
        }
    }

    // 保存商品数据到文件
    public void saveData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dataFile))) {
            oos.writeObject(productMap);
            System.out.println("商品数据保存成功！");
        } catch (IOException e) {
            System.err.println("保存商品数据失败：" + e.getMessage());
        }
    }

    // 从文件加载商品数据
    public void loadData() {
        File file = new File(dataFile);
        if (file.exists()) {
            try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(dataFile))) {
                productMap = (Map<Integer, Product>) ois.readObject();
                System.out.println("商品数据加载成功，共加载 " + productMap.size() + " 条数据！");
            } catch (IOException | ClassNotFoundException e) {
                System.err.println("加载商品数据失败：" + e.getMessage());
                productMap = new HashMap<>(); // 加载失败则初始化空Map
            }
        } else {
            System.out.println("数据文件不存在，初始化空商品列表！");
            initDefaultData(); // 初始化默认数据
        }
    }

    // 初始化默认商品数据
    private void initDefaultData() {
        // 示例1：为Java书籍添加标签
        Set<String> javaBookTags = new HashSet<>();
        javaBookTags.add("编程");
        javaBookTags.add("畅销");
        javaBookTags.add("编程"); // 重复添加验证唯一性
        productMap.put(1, new Product(1, "Java核心技术", 99.0, 100, javaBookTags));
        System.out.println("Java书籍标签Set大小：" + javaBookTags.size());

        // 示例2：为手机添加标签
        Set<String> phoneTags = new HashSet<>();
        phoneTags.add("热门");
        phoneTags.add("新品");
        phoneTags.add("热门"); // 重复添加验证唯一性
        productMap.put(2, new Product(2, "旗舰手机", 2999.0, 50, phoneTags));
        System.out.println("手机标签Set大小：" + phoneTags.size());

        // 示例3：添加一个无标签的商品（验证构造函数默认空Set）
        productMap.put(3, new Product(3, "普通耳机", 199.0, 100, new HashSet<>()));
    }

    // 添加商品
    public void addProduct(Product product) {
        productMap.put(product.getId(), product);
    }

    // 根据ID查询商品
    public Product getProduct(int id) {
        return productMap.get(id);
    }

    // 获取所有商品列表
    public Map<Integer, Product> getAllProducts() {
        return new HashMap<>(productMap);
    }
}